package com.ycky.framework.config;

import com.ycky.common.config.YckyConfig;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @description: Swagger2的接口配置
 * @author: cjj
 * @date: 2025/3/26 16:26
 **/
@Configuration
public class SwaggerConfig {
    /**
     * 系统基础配置
     */
    @Autowired
    private YckyConfig yckyConfig;

    /**
     * 是否开启swagger
     */
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     * 设置请求的统一前缀
     */
    @Value("${swagger.pathMapping}")
    private String pathMapping;

    @Bean
    public OpenAPI customOpenAPI() {
        // 创建安全需求对象，指定使用名为 "Authorization" 的安全方案
        SecurityRequirement securityRequirement = new SecurityRequirement().addList("Authorization");

        // 创建安全方案对象，定义为 HTTP 头部认证，使用 Bearer 令牌
        SecurityScheme securityScheme = new SecurityScheme()
                .name("Authorization")
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")
                .bearerFormat("JWT");

        // 创建组件对象，将安全方案添加到组件中
        Components components = new Components().addSecuritySchemes("Authorization", securityScheme);

        // 创建信息对象，设置 API 文档的标题、描述、版本等信息
        Info info = new Info()
                .title("标题：若依管理系统_接口文档")
                .description("描述：用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
                .contact(new Contact().name(yckyConfig.getName()))
                .version(yckyConfig.getVersion());

        // 创建 OpenAPI 对象，设置启用状态、安全需求、组件和信息
        return new OpenAPI()
                .info(info)
                .addSecurityItem(securityRequirement)
                .components(components);
    }
}
